# encoding: UTF-8

class ThoiKhoaBieu < ActiveRecord::Base
  attr_accessible :MaTKB, :TuanHoc, :ThoiGianBD, :ThoiGianKT, :Thu, :TietBD, :SoTiet, :MaNV_id, :MaPhong, :MaLop, :TenGV, :TenMH, :TGHoc, :TGIn

  belongs_to :nhan_vien, :class_name => "NhanVien", :foreign_key => "MaNV_id"


  # hàm truyền mảng dữ liệu thông qua format csv    EXPORT
  def self.to_csv(tkbs, options ={})
    CSV.generate(options) do |csv|
      csv << column_names
      tkbs.each do |tkb|
        csv << tkb.attributes.values_at(*column_names)
      end
    end
  end

  # hàm truyền dữ liệu gọi lên vào database          IMPORT
  def self.import(file)
    spreadsheet = open_spreadsheet(file)
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      thoikhoabieu = find_by_id(row["id"]) || new
      thoikhoabieu.attributes = row.to_hash.slice(*accessible_attributes)
      return false if thoikhoabieu.invalid?
      thoikhoabieu.save!
    end
    true
  end

  # hàm truy xuất file upload lên
  def self.open_spreadsheet(file)
    case File.extname(file.original_filename)
      when '.csv' then
        Roo::Csv.new(file.path, nil, :ignore)
      when ".xls" then
        Roo::Excel.new(file.path, nil, :ignore)
      when '.xlsx' then
        Roo::Excelx.new(file.path, nil, :ignore)
      else
        raise "Unknown file type: #{file.original_filename}"
    end
  end

  # Hàm kiểm tra xem theo ngày hay xem theo tuần
  def self.week_view

  end

  # @param [String] name_week
  # @param [Date] begin_week
  # @param [Fixnum] end_week
  # @param [Fixnum] selected_week
  def self.select_week_tag(name_week, begin_week, end_week, selected_week)
    #week_begin = Date.new(2013, 1, 14)
    result = "<select name='#{name_week}' style='font-family: Tahoma; font-size: 9pt;'>"
    (1..end_week).each do |i|
      to_week = (begin_week + ((i-1)*7).days).strftime("%d-%m-%Y")
      end_to_week = (begin_week + ((i-1)*7).days).next_week.prev_day.strftime("%d-%m-%Y")
      result += "<option value='#{"%01d" % i}'#{selected_week.to_i == i.to_i ? 'selected="selected"' : ''}>"
      result += "#{"Tuần %s [Từ %s -- Đến %s]" % [i.to_s.rjust(2, '0'), to_week, end_to_week]}"
      result += "</option>"
    end
    result += "</select>"
    result.to_s.html_safe
  end

  # @param [Fixnum] week
  # @param [Array] rooms
  # @param [Date] day_month_year
  # @param [Date] begin_week
  def self.create_table(rooms, week=nil, day_month_year=nil, day_of_week=nil, week_of_day=nil)
    if week==nil && day_month_year==nil
      result = ""
      return
    end
    result ="<table>"
    result+="<thead style='text-align: center;'>"
    result+="<tr>"
    result+="<th style='width: 30px;'>Thứ</th>"
    result+="<th style='width: 19px;'>Ca</th>"
    result+="<th style='width: 28px;'>Tiết</th>"
    rooms.each do |r|
      result +="<th>A#{'%03d' % r}</th>"
    end
    result+="</tr>"
    result+="</thead>"
    result+="<body>"
    # Thứ mấy của ngày đã được chọn
    #day_of_week = localize(day_month_year, :format => '%A').to_i

    # Tuần thứ mấy của ngày đã được chọn
    #week_of_day = (day_month_year - begin_week).to_i/7+1

    # Nếu xem theo ngày thì chỉ lập 1 lần (ngay chính ngày thứ đó), ngược lại lặp từ 2 đến 8
    (day_month_year ? day_of_week..day_of_week : 2..8).each do |thu|

      # Tạo mảng check để kiểm tra tiết này có bị tiết trên chiếm không?
      check = Array.new
      (1..13).each do |c|
        check[c] = 1
      end

      # Tiết 1 -> 13
      (1..13).each do |tiet|
        result += "<tr>"
        # Cột 1: Thứ
        if tiet == 1 then
          result+="<td rowspan='13' style='border-top: 2px solid #0070A8;'>#{thu.to_thu}</td>"
        end

        # Cột 2: Ca
        if tiet == 1 || tiet == 6 then
          result+="<td style='#{"border-top: 2px solid #0070A8" if tiet==1}' rowspan='5'>#{tiet/5 +1}</td>"
        end
        if tiet == 11 then
          result+="<td rowspan='3'>3</td>"
        end

        # Cột 3: Tiết
        result+="<td style='#{"border-top: 2px solid #0070A8" if tiet==1}'>#{tiet}</td>"

        # Lặp các phòng
        rooms.each_with_index do |room, i|
          # Lấy ra 1 TKB theo (thu,tiet,room)
          tkb = ThoiKhoaBieu.where("Thu = ? AND TietBD = ? AND MaPhong = ?", thu, tiet, room).first

          # Nếu tìm thấy
          unless tkb.nil?

            # Lấy ra các tuần học của 1 TKB đó, tách thành 1 mảng
            weeks = tkb.TGIn
            weeks = weeks.chars.to_a

            # Nếu xem theo tuần mà          tuần đó không có môn đó thì sẽ không hiện (gán tkb = nil)
            # Nếu xem theo ngày mà ngày của tuần đó không có môn đó thì sẽ không hiện (gán tkb = nil)
            if (week && weeks[week.to_i-1].to_i != (week.to_i % 10)) || (day_month_year && weeks[week_of_day-1].to_i != (week_of_day % 10))
              tkb=nil
            end
          end

          # Kiểm tra ô này, check=1 nghĩa là không ai chiếm ô này
          if check[i+1] == 1
            # vẽ td và chiếm số hàng bằng số tiết, tô màu theo tiết, nếu có TKB
            result+="<td rowspan='#{tkb.SoTiet unless tkb.nil?}' style='border:1px solid gray;#{tiet.to_style2 unless tkb.nil?}#{'border-top: 2px solid #0070A8' if tiet == 1}'>"
            result+="<a href='#{'thoi_khoa_bieus/' + tkb.id.to_s unless tkb.nil?}' class='tkb'>"
            result+="#{(tkb.MaLop + '<br />' + tkb.TenMH.first_char + '<br />' + tkb.TenGV) unless tkb.nil?}"
            result+="</a>"
            result+="<style>"
            result+=".tkb:hover{background: none;}"
            result+=".tkb{text-decoration: none;}"
            result+="</style>"
            result+="</td>"
            # Nếu có TKB, thì check = số tiết
            check[i+1] = tkb.SoTiet unless tkb.nil?
          else
            # td này bị môn ở trên nó chiếm chỗ, nên sẽ không vẽ td, giảm check xuống 1 đơn vị
            check[i+1] = check[i+1] - 1
          end
        end
        result+="</tr>"
        # End - Tiết 1 -> 13
      end
      # End - Thứ 2 -> 8
    end
    result+="</tbody>"
    result+="</table>"
    result.to_s.html_safe
  end
end

class String
  def first_char
    result = ' '
    self.split(' ').each do |a|
      result = result + a[0].to_s
    end
    result.to_s
  end
end

class Fixnum
  def to_thu
    result = "HAI"
    case self
      when 2 #compare to 1
        result = "HAI"
      when 3 #compare to 1
        result = "BA"
      when 4 #compare to 1
        result = "TƯ"
      when 5 #compare to 1
        result = "NĂM"
      when 6 #compare to 1
        result = "SÁU"
      when 7 #compare to 2
        result = "BẢY"
      when 8 #compare to 2
        result = "CN"
      else
        # type code here
    end
    result.to_s
  end

  def to_style
    case self
      when 2
        result = "background: rgb(129, 247, 37);"
      when 3
        result = "background: rgb(187, 234, 236);"
      when 4
        result = "background: rgb(242, 252, 18);"
      when 5
        result = "background: rgb(248, 57, 143);"
      when 6
        result = "background: rgb(72, 238, 211);"
      when 7
        result = "background: rgb(64, 124, 252);"
      when 8
        result = "background: rgb(181, 99, 245);"
      else
        result = "background: rgb(255, 255, 255);"
    end
    result.to_s.html_safe
  end

  def to_style2
    result = ""
    result = "background: rgb(129, 247, 37);" if self >=1 && self <=5
    result = "background: rgb(187, 234, 236);" if self >=6 && self <=10
    result = "background: rgb(242, 252, 18);" if self >=11 && self <=13
    result.to_s.html_safe
  end
end